package com.liang.pcc.util;

import com.liang.pcc.domain.BusParam;
import com.liang.pcc.domain.TopologyDataDTO;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TreeUtil {
    public static List<TreeNode> buildTree(List<TopologyDataDTO> dataList) {
        // 1. 创建快速访问的哈希表
        Map<String, TreeNode> nodeMap = new HashMap<>(dataList.size());
        List<TreeNode> roots = new ArrayList<>();

        // 2. 第一次遍历：创建所有节点
        for (TopologyDataDTO dto : dataList) {
            TreeNode node = new TreeNode(dto.getId(), dto.getName(), dto.getParentId(), dto.getType(), dto.getMaxReverseLoadRate(), dto.getMinIndependentMountable());
            nodeMap.put(dto.getName(), node);
        }

        // 3. 第二次遍历：建立父子关系
        for (TopologyDataDTO dto : dataList) {
            TreeNode current = nodeMap.get(dto.getName());
            String parentName = dto.getParentName();

            if (parentName == null || parentName.isEmpty()) {
                roots.add(current); // 根节点
            } else {
                TreeNode parent = nodeMap.get(parentName);
                if (parent != null) {
                    parent.getChildren().add(current);
                } else {
                    // 可添加日志：处理孤儿节点
                }
            }
        }
        return roots;
    }

    /**
     * 从树形结构中提取所有母线节点数据
     */
    public static List<BusParam> extractBusParams(List<TreeNode> treeNodes) {
        List<BusParam> busParams = new ArrayList<>();
        for (TreeNode node : treeNodes) {
            extractFromNode(node, busParams);
        }
        return busParams;
    }

    private static void extractFromNode(TreeNode node, List<BusParam> busParams) {
        // 如果是母线节点（type=0），则转换为 BusParam
        if (node.getType() == 0) {
            BusParam param = new BusParam();
            param.setBusName(node.getName());
            param.setMaxReverseLoadRate(node.getMaxReverseLoadRate());
            param.setMinIndependentMountable(node.getMinIndependentMountable());
            busParams.add(param);
        }

        // 递归处理子节点
        for (TreeNode child : node.getChildren()) {
            extractFromNode(child, busParams);
        }
    }
}
